package com.estore.service;

import com.estore.model.Product;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {

    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product> productData = new HashMap<>();
    private String dataFilePath;

    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService() {
        loadConfig(); // 任务二：1. 加载配置文件（优先于数据加载）
        loadData();   // 任务一：2. 加载持久化数据
        // 3. 若数据为空，初始化默认商品
        if (productData.isEmpty()) {
            initDefaultProducts();
        }
    }

    // 任务二：加载配置文件（读取data.file.path）
    private void loadConfig() {
        Properties props = new Properties();
        try (// 字符流+UTF-8编码读取配置，避免中文乱码
             InputStream input = new FileInputStream("config.properties");
             Reader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) {

            props.load(reader);
            // 读取配置项，无值时用默认路径
            this.dataFilePath = props.getProperty("data.file.path", "products.dat").trim();
            System.out.println("配置加载成功，数据文件路径：" + this.dataFilePath);

        } catch (FileNotFoundException e) {
            System.err.println("配置文件config.properties未找到，使用默认路径：products.dat");
            this.dataFilePath = "products.dat";
        } catch (IOException e) {
            System.err.println("配置文件读取失败，使用默认路径：products.dat");
            e.printStackTrace();
            this.dataFilePath = "products.dat";
        }
    }

    // 任务一：从文件加载商品数据（反序列化）
    public void loadData() {
        File dataFile = new File(dataFilePath);
        if (!dataFile.exists()) {
            System.out.println("数据文件不存在，待初始化默认数据");
            return;
        }

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(dataFile))) {
            Object loadedObj = ois.readObject();
            // 验证数据格式，确保是Map<String, Product>
            if (loadedObj instanceof Map<?, ?>) {
                Map<String, Product> loadedData = (Map<String, Product>) loadedObj;
                productData.clear(); // 清空内存数据，避免重复
                productData.putAll(loadedData);
                System.out.println("数据加载成功，共" + productData.size() + "个商品");
            } else {
                System.err.println("数据文件格式错误，无法加载");
            }
        } catch (IOException | ClassNotFoundException e) {
            System.err.println("数据加载失败");
            e.printStackTrace();
        }
    }

    // 任务一：将商品数据保存到文件（序列化）
    public void saveData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dataFilePath))) {
            oos.writeObject(productData); // HashMap实现Serializable，可直接序列化
            System.out.println("数据保存成功，路径：" + dataFilePath);
        } catch (IOException e) {
            System.err.println("数据保存失败");
            e.printStackTrace();
        }
    }
    private void initDefaultProducts() {
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100));
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public String getDataFilePath() {
        return dataFilePath;
    }
    public List<Product> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }
}